Skip to content

chore(m5): add Spool Daemon upgrade notice + clean up docs#117

Merged
graydawnc merged 1 commit intomainfrom
chore/m5-pr6-dialog-docs
Apr 28, 2026
Merged

chore(m5): add Spool Daemon upgrade notice + clean up docs#117
graydawnc merged 1 commit intomainfrom
chore/m5-pr6-dialog-docs

Conversation

@graydawnc
Copy link
Copy Markdown
Collaborator

Summary

Continuation of #112 / #113 / #114 / #115 / #116. Adds the one-time upgrade notice for users coming from a pre-M5 Spool, and finishes the cross-cutting documentation cleanup that earlier PRs deferred.

-1466 / +184 net.

Upgrade notice

A React modal (not a native dialog) so it matches Spool's design system — warm card, Geist Sans, accent CTA — and uses the real Spool Daemon app icon (copied from spool-lab/spool-daemon).

Trigger logic (computed in main, exposed via IPC):

shouldShow = !spoolDaemonNoticeShown && !wasNewDb() && initialUserVersion < 5
Scenario wasNewDb initialUserVersion Shows?
Brand-new user installs post-M5 build true 0 (gated by wasNewDb)
Existing user upgrades from v4 false 4
Existing user upgrades from v0–v3 (very stale) false < 5
Already-upgraded user, second launch false 5
User quits without dismissing ❌ next launch (initialVersion is now 5)

The "lost on quit-before-dismiss" behaviour is intentional — this is an informational nudge, not critical state, and avoiding a second persistent flag keeps the design simple. (VS Code-style "what's new" notices behave the same way.)

wasNewDb() and getInitialUserVersion() are added to @spool-lab/core's db.ts. Both are captured before runMigrations() runs so the post-migration state doesn't muddy the detection.

Dialog UX:

  • Daemon icon, 72×72 squircle
  • Title "Connectors moved to Spool Daemon"
  • Body explains that connectors live in Spool Daemon now and synced data was removed
  • Primary "Get Spool Daemon" → shell.openExternal('https://spool.pro/daemon') and persists shown flag
  • Secondary "Maybe later" → just persists shown flag
  • Backdrop click / Escape do not dismiss (forces an explicit choice — but both choices are non-blocking)

Side fix: uiPreferences now respects SPOOL_DATA_DIR (was hardcoded to ~/.spool/ui.json regardless of env override). Surfaced during sandbox smoke testing and would have leaked dialog-shown state out of test sandboxes.

Doc cleanup (cross-cutting)

  • README.md — drop stars/bookmarks/likes from tagline, drop the Connectors bullet, replace with a forward to Spool Daemon, drop the fieldtheory-cli acknowledgement (Twitter bookmarks gone)
  • DESIGN.md — drop bookmarks/capture from Product Context, rewrite Source Chips + Sources Panel sections to be session-only, drop "Capture / add" icon, fix Status Bar dot color guidance
  • docs/spool-positioning.md — strip bookmark/star marketing, end with a forward to Spool Daemon
  • packages/core/README.md — drop "connected sources" / "connector sync engine" / "connector loader" / "connector registry"; replaced with watcher + stars
  • Deleted docs/connector-developer-guide.md (607 lines) and docs/connector-sync-architecture.md (924 lines) — both exclusively about the removed subsystem

docs/superpowers/* historical plans + specs left intact (they're dated git-log-style records, not current docs).

Features that should still work post-PR (verified)

Feature Verification
Core build + tests 48/48 pass (migration-v5 tests now also cover wasNewDb / getInitialUserVersion)
CLI build + tests 21/21 pass
App typecheck pnpm exec tsc --noEmit clean
App electron build pnpm build:electron clean
pnpm install --frozen-lockfile Clean
Upgrade-path smoke Downgraded sandbox to user_version=4, cleared spoolDaemonNoticeShown, launched dev → modal appears with daemon icon, copy correct, "Spool Daemon" doesn't break across lines
Fresh-install smoke (logic) wasNewDb=true short-circuits; covered by migration-v5.test.ts "no-op fresh install" case
Re-launch after dismiss Flag persists in ui.json, getDaemonNoticePending returns false, modal does not reappear
Get Spool Daemon button Opens https://spool.pro/daemon via shell.openExternal (not spool.dev — that's not the canonical domain)
Session search / star / settings Untouched, still functional

Test plan

  • Core 48/48 pass with new accessor coverage
  • CLI 21/21 pass (rebuilt better-sqlite3 for node ABI before running)
  • App typecheck + build clean
  • pnpm install --frozen-lockfile clean
  • Manual smoke: upgrade-path modal looks right, button actions persist flag, re-launch doesn't re-trigger
  • All spool.dev/daemon references swept to spool.pro/daemon

🤖 Generated with Claude Code

One-time notice for users upgrading from a pre-M5 Spool, plus the
cross-cutting documentation cleanup that PR2-#5 deferred.

## Upgrade notice

Built as a React modal (not a native dialog) so it matches Spool's
design system — warm card, Geist Sans, accent CTA — and shows the
real Spool Daemon app icon (copied from spool-lab/spool-daemon).

Trigger logic (in main, exposed via IPC):
- shouldShow = !shown && !wasNewDb && initialUserVersion < 5
- New users with no prior DB → don't show (no captures to mourn)
- Existing users at v0-v4 → show on first launch after upgrade
- After dismiss/install click → flag persists, never shown again
- User who quits without dismissing → loses the notice (acceptable
  for an informational nudge; not critical state)

The "wasNewDb" + "getInitialUserVersion" helpers are added to
packages/core/src/db/db.ts. Both are captured before runMigrations
runs so the post-state can't muddy the upgrade detection.

uiPreferences now respects SPOOL_DATA_DIR (was hardcoded to
~/.spool/ui.json regardless of env override) — this surfaced during
sandbox smoke testing and would have leaked dialog-shown state out
of test sandboxes.

The "Get Spool Daemon" button uses shell.openExternal to
https://spool.pro/daemon (was earlier mistakenly written as
spool.dev/daemon in three places — fixed across the dialog, README,
and positioning doc).

## Doc cleanup (cross-cutting)

- README.md — drop stars/bookmarks/likes from tagline, drop the
  Connectors bullet, replace with a forward to Spool Daemon, drop
  the fieldtheory-cli acknowledgement (Twitter bookmarks gone)
- DESIGN.md — drop bookmarks/capture from Product Context, rewrite
  Source Chips + Sources Panel sections to be session-only, drop
  "Capture / add" icon, fix Status Bar dot color guidance
- docs/spool-positioning.md — strip bookmark/star marketing, end
  with a forward to Spool Daemon
- packages/core/README.md — drop "connected sources", "connector
  sync engine", "connector loader", "connector registry" — replaced
  with watcher + stars
- Deleted docs/connector-developer-guide.md (607 lines) and
  docs/connector-sync-architecture.md (924 lines) — both
  exclusively about the removed subsystem

docs/superpowers/* historical plans + specs left intact (they're
dated git-log-style records, not current docs).

## Tests

- Extended migration-v5.test.ts with assertions for the new
  wasNewDb / getInitialUserVersion helpers on both the upgrade
  path (wasNewDb=false, initialVersion=4) and the fresh-install
  path (wasNewDb=true, initialVersion=0).
- Smoke verified locally: launching dev against a downgraded v4
  sandbox shows the modal with the right icon and copy; clicking
  either button persists the flag and the modal does not return on
  re-launch.

Net -1466 / +103.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@graydawnc graydawnc merged commit 0f49870 into main Apr 28, 2026
4 checks passed
@graydawnc graydawnc deleted the chore/m5-pr6-dialog-docs branch April 28, 2026 10:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant